1. Field of the Invention
The present invention relates generally to managing memory, and in particular, to a method, apparatus, and article of manufacture for using a heap to manage memory.
2. Description of the Related Art
Files and file systems provide mechanisms for long term storage of an application and are supported by most operating systems. Programming languages usually provide a layer application programming interface (API) to use to access files that then internally uses the underlying operating file system. Generally, in the prior art, a file and file systems are linear in nature (i.e., they are accessed in a linear manner). Thus, the application is able to write data to a point (or read data from a point) in a sequential manner. However, file systems may also be randomly accessed which allows one to “seek” to a point but from that point, access is sequential in nature. For example, a file pointer may be randomly set to point to the location where data is either written to or read from in a linear/sequential manner. Accordingly, while the file systems are linear in access, the file pointer may be positioned randomly.
Once a file pointer is set, an application is able to read or write data in a linear manner. However, the application is responsible for keeping track of what data is stored at what file pointer position. Further, when data is inserted into the linear file, the entire file after the insertion point must be rewritten. Accordingly, the prior art requires applications to maintain significant knowledge about file systems while inserting and removing data inefficiently.
FIG. 1 illustrates the use of a prior art linear file access system. The file system allows a user to seek 102 to a particular memory offset location N (thereby providing the ability to randomly position a pointer). Thereafter, the file is linear in nature stored at bytes N 104, N+1 106, and N+2 108.
The physical file system used by many operating systems is often a collection of blocks with linkage information between the blocks that is controlled by a linear access array. FIG. 2 illustrates a prior art file system controlled by such a linear access array. For a given offset in the file, the index array of pointers 202 is used to point to the block 204-208 that contains the given data. The requested data may then be accessed in the block.
When storing and retrieving files, memory is consumed. Various methods have been developed for managing memory. For example, some prior art applications may utilize heaps to manage memory. A heap is a term used to describe a pool of memory available to an application. Applications request a block of memory from the heap for use (allocation). The application may later release the memory back to the heap (deallocation). The implementation of a heap system is generally a requirement for all operating systems.
A common feature of most heaps is that they keep track of all blocks that were previously allocated and then later deallocated (so they may be reused by later allocation requests). Such a list of deallocated blocks is commonly called a free-list. When an allocation request is made, the heap will attempt to reuse a deallocated block from the free-list prior to requesting new memory from the operating system. In this regard, the free-list is searched for a block that satisfies the allocation request. In the prior art, the free list is searched in a linear manner.
In one prior art example, a heap is broken up into multiple chunks—each representing approximately a megabyte of free memory. In each chunk, the free blocks are stored sequentially. Thus, searching for a particular size or finding the smallest block that will satisfy the desired allocation request is of order N—linear.
The prior art may also utilize a heap configured as a binary tree where each node in the tree represents a block of memory of a certain size. Two links exist for each node. One link points to memory blocks smaller in size while a second link may point to memory blocks of equal or greater size. The problem with such binary free-list trees is that applications tend to have many objects of the same size in the free list. Accordingly, when traversing a binary tree to find a satisfactory block of memory, search times may be near the same as a linear search.
In addition to the above, it is common for programmers to have a coding error that results in a heap being asked to deallocate a block that the heap never allocated. Heaps generally do not detect this kind of error and thus they cause an application to crash. Sometimes, there are different heaps used—one used during development that has significant overhead in integrity checking, and another used for the end product that has no checking. While such a solution may help reduce errors, in many cases, there are significant differences in runtime behavior of an application between development mode and end product mode. Accordingly, what is needed is an ability to quickly and efficiently perform integrity checking at runtime that does not utilize significant overhead.